package space.hyf.mapper;

import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import space.hyf.entity.Blog;
import space.hyf.model.dto.BlogView;
import space.hyf.model.dto.BlogVisibility;
import space.hyf.model.vo.*;

import java.util.List;

/**
 * @Description: 博客文章持久层接口
 * @Author: HCode
 * @Date: 2022-07-26
 */
@Mapper
@Repository
public interface BlogMapper {
	/**
	 * 通过标题和分类id获取博客文章列表
	 * @param title 博客标题
	 * @param categoryId 分类id
	 * @return 博客列表
	 */
	List<Blog> getListByTitleAndCategoryId(String title, Integer categoryId);

	/**
	 *  通过查询获取已发布的博客列表
	 * @param query 搜索要求
	 * @return 已发布的博客列表
	 */
	List<SearchBlog> getSearchBlogListByQueryAndIsPublished(String query);

	/**
	 * 获取博客ID和标题列表
	 * @return 博客标题列表
	 */
	List<Blog> getIdAndTitleList();

	/**
	 * 获取已发布的最新推荐博客
	 * @return 最新推荐博客列表
	 */
	List<NewBlog> getNewBlogListByIsPublished();

	/**
	 * 获取已发布的博客信息
	 * @return 博客信息
	 */
	List<BlogInfo> getBlogInfoListByIsPublished();

	/**
	 * 通过分类获取
	 * @param categoryName 分类名称
	 * @return 该分类的博客列表
	 */
	List<BlogInfo> getBlogInfoListByCategoryNameAndIsPublished(String categoryName);

	/**
	 * 通过标签获取已发布的博客列表
	 * @param tagName 标签名称
	 * @return 该标签下的博客列表
	 */
	List<BlogInfo> getBlogInfoListByTagNameAndIsPublished(String tagName);

	/**
	 * 查询公开博客年月List
	 * @return  博客年月
	 */
	List<String> getGroupYearMonthByIsPublished();

	/**
	 * 按年月查询公开博客简要信息List
	 * @param yearMonth 年月
	 * @return 简要信息
	 */
	List<ArchiveBlog> getArchiveBlogListByYearMonthAndIsPublished(String yearMonth);

	/**
	 * 查询随机的公开且推荐文章
	 * @param limitNum 推荐文章的数量限制
	 * @return 随机文章
	 */
	List<RandomBlog> getRandomBlogListByLimitNumAndIsPublishedAndIsRecommend(Integer limitNum);

	/**
	 * 查询所有文章的浏览量
	 * @return 所以文章的浏览量列表
	 */
	List<BlogView> getBlogViewsList();

	/**
	 * 按id删除博客
	 * @param id 博客ID
	 * @return 删除的结果
	 */
	int deleteBlogById(Long id);

	/**
	 * 维护 blog_tag 表(删除)
	 * @param blogId 博客ID
	 * @return  删除的结果
	 */
	int deleteBlogTagByBlogId(Long blogId);

	/**
	 * 添加博客
	 * @param blog 博客数据
	 * @return 保存的结果
	 */
	int saveBlog(space.hyf.model.dto.Blog blog);

	/**
	 * 维护 blog_tag 表(添加)
	 * @param blogId 博客ID
	 * @param tagId 标签ID
	 * @return 保存后的结果
	 */
	int saveBlogTag(Long blogId, Long tagId);

	/**
	 * 更新博客推荐状态
	 * @param blogId 博客ID
	 * @param recommend 推荐状态
	 * @return  更新的结果
	 */
	int updateBlogRecommendById(Long blogId, Boolean recommend);

	/**
	 * 更新博客可见性状态
	 * @param blogId 博客ID
	 * @param bv 可见性
	 * @return 更新的结果
	 */
	int updateBlogVisibilityById(Long blogId, BlogVisibility bv);

	/**
	 * 更新博客置顶状态
	 * @param blogId 博客ID
	 * @param top 置顶状态
	 * @return 更新的结果
	 */
	int updateBlogTopById(Long blogId, Boolean top);

	/**
	 * 更新博客阅读次数
	 * @param blogId 博客ID
	 * @param views 阅读量
	 * @return 更新的结果
	 */
	int updateViews(Long blogId, Integer views);

	/**
	 * 按id查询博客
	 * @param id 博客ID
	 * @return 博客文章
	 */
	Blog getBlogById(Long id);

	/**
	 * 按id查询博客标题
	 * @param id ID
	 * @return 博客标题
	 */
	String getTitleByBlogId(Long id);

	/**
	 * 按id查询公开博客
	 * @param id ID
	 * @return 公开博客
	 */
	BlogDetail getBlogByIdAndIsPublished(Long id);

	/**
	 * 查询受密码保护文章密码
	 * @param blogId 博客ID
	 * @return 保护文章的密码
	 */
	String getBlogPassword(Long blogId);

	/**
	 * 更新博客
	 * @param blog  博客数据
	 * @return 更新文章的结果
	 */
	int updateBlog(space.hyf.model.dto.Blog blog);

	/**
	 * 博客文章数量
	 * @return 文章数量
	 */
	int countBlog();

	/**
	 *  查询公开博客总数
	 * @return 查询公开博客总数
	 */
	int countBlogByIsPublished();

	/**
	 * 查询一个分类ID的博客文章数量
	 * @param categoryId 分类ID
	 * @return 该分类的博客文章数量
	 */
	int countBlogByCategoryId(Long categoryId);

	/**
	 * 查询一个标签ID的博客文章数量
	 * @param tagId 标签ID
	 * @return 该标签下博客文章数量
	 */
	int countBlogByTagId(Long tagId);

	/**
	 * 查询博客评论是否开启
	 * @param blogId 博客ID
	 * @return   博客的评论是否开启
	 */
	Boolean getCommentEnabledByBlogId(Long blogId);

	/**
	 * 查询博客是否公开
	 * @param blogId 博客文章ID
	 * @return  查询博客公开状态
	 */
	Boolean getPublishedByBlogId(Long blogId);

	/**
	 * 查询每个分类下博客文章数量
	 * @return 该分类下的博客数量
	 */
	List<CategoryBlogCount> getCategoryBlogCountList();
}
